/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package investigaciones_itm.Presupuestos;

import com.sun.rave.web.ui.appbase.AbstractPageBean;
import itm.bo.presupuestos.PresupuestosBO;
import itm.vo.presupuestos.rubroProyectoVO;
import itm.vo.proyectosInvestigacion.ProyectoInvestigacionVO;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.FacesException;
import javax.faces.component.UIParameter;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 *
 * @version RubroFuenteReal.java
 * @version Created on 6/07/2009, 12:47:50 PM
 * @author jimmy
 */
public class RubroFuenteReal extends AbstractPageBean {

    private HtmlSelectOneMenu menuProyectos;
    private List<SelectItem> itemProyectos = new ArrayList<SelectItem>();
    private List<ProyectoInvestigacionVO> listaProyectos = new ArrayList<ProyectoInvestigacionVO>();
    private PresupuestosBO presupuestosBO;
    private List<rubroProyectoVO> listaRubros = new ArrayList<rubroProyectoVO>();
    private HttpSession sesion;
    private long proyecto;
    private double presuApr;
    private double presuReal;
    private static final String ID_SESSION_RUBRO_FUENTE_REAL = "rubro.fuente.real";
    private boolean boolComponentes;
    private boolean boolInpuText;
    private boolean boolBotonGuardar;
    private boolean boolBotonSiguiente;
    private String status;

    public RubroFuenteReal() {
        this.Inicializar();
    }

    protected void Inicializar() {
        this.inicializarObjetos();
        this.cargarProyectos();
        this.cargarVariablesSesionLocal();
        this.setBoolBotonSiguiente(true);
    }

    protected void inicializarObjetos() {
        presupuestosBO = new PresupuestosBO();
    }

    protected void cargarVariablesSesionLocal() {
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "listaRubros") != null) {
            this.setListaRubros((List<rubroProyectoVO>) this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "listaRubros"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "proyecto") != null) {
            this.setProyecto((Long) this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "proyecto"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "presuApr") != null) {
            this.setPresuApr((Double) this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "presuApr"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "presuReal") != null) {
            this.setPresuReal((Double) this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "presuReal"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolComponentes") != null) {
            this.setBoolComponentes((Boolean) this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolComponentes"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolBotonGuardar") != null) {
            this.setBoolBotonGuardar((Boolean) this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolBotonGuardar"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolBotonSiguiente") != null) {
            this.setBoolBotonSiguiente((Boolean) this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolBotonSiguiente"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolInpuText") != null) {
            this.setBoolInpuText((Boolean) this.getSesion().getAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolInpuText"));
        }
    }

    protected void cargarProyectos() {
        try {
            listaProyectos = presupuestosBO.listarDefProyectoXReal();
            for (int i = 0; i < listaProyectos.size(); i++) {
                itemProyectos.add(new SelectItem(Long.toString(listaProyectos.get(i).getIdProyecto()),
                        listaProyectos.get(i).getTituloProyecto()));
            }
        } catch (Exception ex) {
            Logger.getLogger(RubroFuenteAprobado.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void menuProyAction(ValueChangeEvent vce) {
        this.setProyecto(Long.parseLong(this.getMenuProyectos().getValue().toString()));
        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "proyecto", this.getProyecto());
        try {
            listaRubros = presupuestosBO.listarRubrosProyPresuReal(proyecto);
            if (listaRubros != null) {
                if (listaRubros.size() != 0) {
                    if (listaRubros.get(0).getStatus().equals("R_FTE")) {
                        this.setBoolBotonGuardar(true);
                        this.setBoolBotonSiguiente(false);
                        this.setBoolInpuText(true);
                        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolBotonGuardar", this.isBoolBotonGuardar());
                        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolBotonSiguiente", this.isBoolBotonSiguiente());
                        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolInpuText", this.isBoolInpuText());
                    }
                    if (listaRubros.get(0).getStatus().equals("R_TIM")) {
                        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "listaRubros", this.getListaRubros());
                        this.setStatus(listaRubros.get(0).getStatus());
                        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "status", this.getStatus());
                        FacesContext.getCurrentInstance().getExternalContext().redirect("../Presupuestos/RubroTiempoReal.jsp");
                    }
                    if (listaRubros.get(0).getStatus().equals("R_COM")) {
                        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "listaRubros", this.getListaRubros());
                        this.setStatus(listaRubros.get(0).getStatus());
                        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "status", this.getStatus());
                        FacesContext.getCurrentInstance().getExternalContext().redirect("../Presupuestos/RubroConceptoReal.jsp");
                    }
                    if (listaRubros.get(0).getStatus().equals("NUEVO")) {
                        listaRubros = presupuestosBO.listarPresupFteReal(proyecto);
                    }
                    this.calcularTotal();
                    this.calcularPresupuestos();
                    this.setBoolComponentes(true);
                    this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolComponentes", this.isBoolComponentes());
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(RubroFuenteAprobado.class.getName()).log(Level.SEVERE, null, ex);
            error("Error al listar rubros por proyecto");
        }
    }

    protected void calcularTotal() {

        double totalFuente = 0;
        double totalFuenteEst = 0;
        for (int i = 0; i < listaRubros.size(); i++) {
            for (int j = 0; j < listaRubros.get(i).getListaRubros().size(); j++) {
                totalFuente = totalFuente + listaRubros.get(i).getListaRubros().get(j).getValorFuenteF();
                totalFuenteEst = totalFuenteEst + listaRubros.get(i).getListaRubros().get(j).getValorAPR();
            }
            listaRubros.get(i).setTotal(totalFuente);
            listaRubros.get(i).setTotalAnt(totalFuenteEst);
            totalFuente = 0;
            totalFuenteEst = 0;
        }
        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "listaRubros", this.getListaRubros());
    }

    protected void calcularPresupuestos() {
        double totalPresuReal = 0;
        double totalPresuApr = 0;
        for (int i = 0; i < listaRubros.size(); i++) {
            totalPresuReal = totalPresuReal + listaRubros.get(i).getTotal();
            totalPresuApr = totalPresuApr + listaRubros.get(i).getTotalAnt();
        }
        this.setPresuApr(totalPresuApr);
        this.setPresuReal(totalPresuReal);
        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "presuApr", this.getPresuApr());
        this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "presuReal", this.getPresuReal());
    }

    public void actionInputText(ValueChangeEvent vce) {
        double valorNuevoFuente = Double.parseDouble(vce.getNewValue().toString());
        UIParameter idFuenteParam = (UIParameter) vce.getComponent().findComponent("idFuente");
        UIParameter idRubroParam = (UIParameter) vce.getComponent().findComponent("idRubro");
        for (int i = 0; i < listaRubros.size(); i++) {
            if (listaRubros.get(i).getIdRubro() == Integer.parseInt(idRubroParam.getValue().toString())) {
                for (int j = 0; j < listaRubros.get(i).getListaRubros().size(); j++) {
                    if (listaRubros.get(i).getListaRubros().get(j).getIdFuenteF() == Integer.parseInt(idFuenteParam.getValue().toString())) {
                        listaRubros.get(i).getListaRubros().get(j).setValorFuenteF(valorNuevoFuente);
                    }
                }
            }
        }
        this.calcularTotal();
        this.calcularPresupuestos();

    }

    public void actionBotonGuardar() {
        try {
            presupuestosBO.crearFuenteReal(proyecto, listaRubros);
            presupuestosBO.modificarPresupuesto(proyecto, "R_FTE");
            this.setBoolBotonGuardar(true);
            this.setBoolBotonSiguiente(false);
            this.setBoolInpuText(true);
            this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolBotonGuardar", this.isBoolBotonGuardar());
            this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolBotonSiguiente", this.isBoolBotonSiguiente());
            this.getSesion().setAttribute(ID_SESSION_RUBRO_FUENTE_REAL + "boolInpuText", this.isBoolInpuText());
            info("Se registro correctamente el Presupuesto Real por fuente");
        } catch (Exception ex) {
            Logger.getLogger(RubroFuenteAprobado.class.getName()).log(Level.SEVERE, null, ex);
            error("Error al guardar datos");
        }
    }

    public boolean isBoolBotonGuardar() {
        return boolBotonGuardar;
    }

    public void setBoolBotonGuardar(boolean boolBotonGuardar) {
        this.boolBotonGuardar = boolBotonGuardar;
    }

    public boolean isBoolBotonSiguiente() {
        return boolBotonSiguiente;
    }

    public void setBoolBotonSiguiente(boolean boolBotonSiguiente) {
        this.boolBotonSiguiente = boolBotonSiguiente;
    }

    public boolean isBoolComponentes() {
        return boolComponentes;
    }

    public void setBoolComponentes(boolean boolComponentes) {
        this.boolComponentes = boolComponentes;
    }

    public boolean isBoolInpuText() {
        return boolInpuText;
    }

    public void setBoolInpuText(boolean boolInpuText) {
        this.boolInpuText = boolInpuText;
    }

    public List<SelectItem> getItemProyectos() {
        return itemProyectos;
    }

    public void setItemProyectos(List<SelectItem> itemProyectos) {
        this.itemProyectos = itemProyectos;
    }

    public List<ProyectoInvestigacionVO> getListaProyectos() {
        return listaProyectos;
    }

    public void setListaProyectos(List<ProyectoInvestigacionVO> listaProyectos) {
        this.listaProyectos = listaProyectos;
    }

    public List<rubroProyectoVO> getListaRubros() {
        return listaRubros;
    }

    public void setListaRubros(List<rubroProyectoVO> listaRubros) {
        this.listaRubros = listaRubros;
    }

    public HtmlSelectOneMenu getMenuProyectos() {
        return menuProyectos;
    }

    public void setMenuProyectos(HtmlSelectOneMenu menuProyectos) {
        this.menuProyectos = menuProyectos;
    }

    public double getPresuReal() {
        return presuReal;
    }

    public void setPresuReal(double presuReal) {
        this.presuReal = presuReal;
    }

    public double getPresuApr() {
        return presuApr;
    }

    public void setPresuApr(double presuApr) {
        this.presuApr = presuApr;
    }

    public long getProyecto() {
        return proyecto;
    }

    public void setProyecto(long proyecto) {
        this.proyecto = proyecto;
    }

    public HttpSession getSesion() {
        return (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    }

    public void setSesion(HttpSession sesion) {
        this.sesion = sesion;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     *
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */
    @Override
    public void init() {

        // Perform initializations inherited from our superclass
        super.init();
// Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here
// <editor-fold defaultstate="collapsed" desc="Visual-Web-managed Component Initialization">
// Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("Page1 Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    @Override
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    @Override
    public void prerender() {
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() {
    }
}

